﻿/*
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
 *
 * == BEGIN LICENSE ==
 *
 * Licensed under the terms of any of the following licenses at your
 * choice:
 *
 *  - GNU General Public License Version 2 or later (the "GPL")
 *    http://www.gnu.org/licenses/gpl.html
 *
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 *    http://www.gnu.org/licenses/lgpl.html
 *
 *  - Mozilla Public License Version 1.1 or later (the "MPL")
 *    http://www.mozilla.org/MPL/MPL-1.1.html
 *
 * == END LICENSE ==
 *
 * Stretch the editor to full window size and back.
 */

var FCKFitWindow = function()
{
    this.Name = 'FitWindow' ;
}

FCKFitWindow.prototype.Execute = function()
{
    var eEditorFrame        = window.frameElement ;
    var eEditorFrameStyle    = eEditorFrame.style ;

    var eMainWindow            = parent ;
    var eDocEl                = eMainWindow.document.documentElement ;
    var eBody                = eMainWindow.document.body ;
    var eBodyStyle            = eBody.style ;
    var eParent ;

    // Save the current selection and scroll position.
    var oRange, oEditorScrollPos ;
    if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
    {
        oRange = new FCKDomRange( FCK.EditorWindow ) ;
        oRange.MoveToSelection() ;
        oEditorScrollPos = FCKTools.GetScrollPosition( FCK.EditorWindow ) ;
    }
    else
    {
        var eTextarea = FCK.EditingArea.Textarea ;
        oRange = !FCKBrowserInfo.IsIE && [ eTextarea.selectionStart, eTextarea.selectionEnd ] ;
        oEditorScrollPos = [ eTextarea.scrollLeft, eTextarea.scrollTop ] ;
    }

    // No original style properties known? Go fullscreen.
    if ( !this.IsMaximized )
    {
        // Registering an event handler when the window gets resized.
        if( FCKBrowserInfo.IsIE )
            eMainWindow.attachEvent( 'onresize', FCKFitWindow_Resize ) ;
        else
            eMainWindow.addEventListener( 'resize', FCKFitWindow_Resize, true ) ;

        // Save the scrollbars position.
        this._ScrollPos = FCKTools.GetScrollPosition( eMainWindow ) ;

        // Save and reset the styles for the entire node tree. They could interfere in the result.
        eParent = eEditorFrame ;
        // The extra () is to avoid a warning with strict error checking. This is ok.
        while( (eParent = eParent.parentNode) )
        {
            if ( eParent.nodeType == 1 )
            {
                eParent._fckSavedStyles = FCKTools.SaveStyles( eParent ) ;
                eParent.style.zIndex = FCKConfig.FloatingPanelsZIndex - 1 ;
            }
        }

        // Hide IE scrollbars (in strict mode).
        if ( FCKBrowserInfo.IsIE )
        {
            this.documentElementOverflow = eDocEl.style.overflow ;
            eDocEl.style.overflow    = 'hidden' ;
            eBodyStyle.overflow        = 'hidden' ;
        }
        else
        {
            // Hide the scroolbars in Firefox.
            eBodyStyle.overflow = 'hidden' ;
            eBodyStyle.width = '0px' ;
            eBodyStyle.height = '0px' ;
        }

        // Save the IFRAME styles.
        this._EditorFrameStyles = FCKTools.SaveStyles( eEditorFrame ) ;

        // Resize.
        var oViewPaneSize = FCKTools.GetViewPaneSize( eMainWindow ) ;

        eEditorFrameStyle.position    = "absolute";
        eEditorFrame.offsetLeft ;        // Kludge for Safari 3.1 browser bug, do not remove. See #2066.
        eEditorFrameStyle.zIndex    = FCKConfig.FloatingPanelsZIndex - 1;
        eEditorFrameStyle.left        = "0px";
        eEditorFrameStyle.top        = "0px";
        eEditorFrameStyle.width        = oViewPaneSize.Width + "px";
        eEditorFrameStyle.height    = oViewPaneSize.Height + "px";

        // Giving the frame some (huge) borders on his right and bottom
        // side to hide the background that would otherwise show when the
        // editor is in fullsize mode and the window is increased in size
        // not for IE, because IE immediately adapts the editor on resize,
        // without showing any of the background oddly in firefox, the
        // editor seems not to fill the whole frame, so just setting the
        // background of it to white to cover the page laying behind it anyway.
        if ( !FCKBrowserInfo.IsIE )
        {
            eEditorFrameStyle.borderRight = eEditorFrameStyle.borderBottom = "9999px solid white" ;
            eEditorFrameStyle.backgroundColor        = "white";
        }

        // Scroll to top left.
        eMainWindow.scrollTo(0, 0);

        // Is the editor still not on the top left? Let's find out and fix that as well. (Bug #174)
        var editorPos = FCKTools.GetWindowPosition( eMainWindow, eEditorFrame ) ;
        if ( editorPos.x != 0 )
            eEditorFrameStyle.left = ( -1 * editorPos.x ) + "px" ;
        if ( editorPos.y != 0 )
            eEditorFrameStyle.top = ( -1 * editorPos.y ) + "px" ;

        this.IsMaximized = true ;
    }
    else    // Resize to original size.
    {
        // Remove the event handler of window resizing.
        if( FCKBrowserInfo.IsIE )
            eMainWindow.detachEvent( "onresize", FCKFitWindow_Resize ) ;
        else
            eMainWindow.removeEventListener( "resize", FCKFitWindow_Resize, true ) ;

        // Restore the CSS position for the entire node tree.
        eParent = eEditorFrame ;
        // The extra () is to avoid a warning with strict error checking. This is ok.
        while( (eParent = eParent.parentNode) )
        {
            if ( eParent._fckSavedStyles )
            {
                FCKTools.RestoreStyles( eParent, eParent._fckSavedStyles ) ;
                eParent._fckSavedStyles = null ;
            }
        }

        // Restore IE scrollbars
        if ( FCKBrowserInfo.IsIE )
            eDocEl.style.overflow = this.documentElementOverflow ;

        // Restore original size
        FCKTools.RestoreStyles( eEditorFrame, this._EditorFrameStyles ) ;

        // Restore the window scroll position.
        eMainWindow.scrollTo( this._ScrollPos.X, this._ScrollPos.Y ) ;

        this.IsMaximized = false ;
    }

    FCKToolbarItems.GetItem('FitWindow').RefreshState() ;

    // It seams that Firefox restarts the editing area when making this changes.
    // On FF 1.0.x, the area is not anymore editable. On FF 1.5+, the special
    //configuration, like DisableFFTableHandles and DisableObjectResizing get
    //lost, so we must reset it. Also, the cursor position and selection are
    //also lost, even if you comment the following line (MakeEditable).
    // if ( FCKBrowserInfo.IsGecko10 )    // Initially I thought it was a FF 1.0 only problem.
    if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
        FCK.EditingArea.MakeEditable() ;

    FCK.Focus() ;

    // Restore the selection and scroll position of inside the document.
    if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
    {
        oRange.Select() ;
        FCK.EditorWindow.scrollTo( oEditorScrollPos.X, oEditorScrollPos.Y ) ;
    }
    else
    {
        if ( !FCKBrowserInfo.IsIE )
        {
            eTextarea.selectionStart = oRange[0] ;
            eTextarea.selectionEnd = oRange[1] ;
        }
        eTextarea.scrollLeft = oEditorScrollPos[0] ;
        eTextarea.scrollTop = oEditorScrollPos[1] ;
    }
}

FCKFitWindow.prototype.GetState = function()
{
    if ( FCKConfig.ToolbarLocation != 'In' )
        return FCK_TRISTATE_DISABLED ;
    else
        return ( this.IsMaximized ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF );
}

function FCKFitWindow_Resize()
{
    var oViewPaneSize = FCKTools.GetViewPaneSize( parent ) ;

    var eEditorFrameStyle = window.frameElement.style ;

    eEditorFrameStyle.width        = oViewPaneSize.Width + 'px' ;
    eEditorFrameStyle.height    = oViewPaneSize.Height + 'px' ;
}
